/**
 * [75] 颜色分类
 *
 * @format
 * @lc app=leetcode.cn id=75 lang=javascript
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
// 
var sortColors = function (nums) {
    // 初始化指针
    let [l, r] = [0, nums.length - 1]
    while (nums[l] == 0) l++ // nums[l] -> 1|2
    while (nums[r] == 2) r-- // nums[r] -> 0|1
    let m = l + 1
    while (nums[m] == 1) m++ // nums[m] -> 0|2
    // 遍历交换值
    while (m < r) {
        if (nums[m] == 0) {
            nums[m] = nums[l]
            nums[l] = 0
            l++
        } else if (nums[m] == 2) {
            nums[m] = nums[r]
            nums[r] = 2
            r--
        } else m++
        if (l == m) m++
    }
    // nums[l] 0 0 0 1 1 1 2 2 2
    // nums[r] 0 1 2 0 1 2 0 1 2
    //         - - -   - -     -
    if (nums[l] > nums[r] && l < r) {
        nums[l] += nums[r]
        nums[r] = nums[l] - nums[r]
        nums[l] -= nums[r]
    }
}
// @lc code=end
